package com.zp.self.module.level_4_算法练习.数学.位运算;
import org.junit.Test;

/**
 * @author By ZengPeng
 */
public class 力扣_868_二进制间距 {
    @Test
    public void main() {
        
        Solution solution = new 力扣_868_二进制间距().new Solution();
        System.out.println(solution.binaryGap(22));
    }

    /**
     题目：给定一个正整数 n，找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1，返回 0 。
        如果只有 0 将两个 1 分隔开（可能不存在 0 ），则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如，"1001" 中的两个 1 的距离为 3 。

     示例 1：
     输入：n = 22
     输出：2
     解释：22 的二进制是 "10110" 。
     在 22 的二进制表示中，有三个 1，组成两对相邻的 1 。
     第一对相邻的 1 中，两个 1 之间的距离为 2 。
     第二对相邻的 1 中，两个 1 之间的距离为 1 。
     答案取两个距离之中最大的，也就是 2 。

     示例 2：
     输入：n = 8
     输出：0
     解释：8 的二进制是 "1000" 。
     在 8 的二进制表示中没有相邻的两个 1，所以返回 0 。

     示例 3：
     输入：n = 5
     输出：2
     解释：5 的二进制是 "101" 。

     分析：【P 💔】
        1.位移：遍历每一位，记录上一次出现1的位置，记录最大距离
                --执行耗时:0 ms,击败了100.00% 的Java用户
                --编码耗时:8:32

     边界值 & 注意点：
        1.
     **/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int binaryGap(int n) {
        int max=0,pro=-1,currentIdex=0;
        while (n>0){
            if((n&1) ==1){
                if(pro!=-1){
                    max = Math.max(max,currentIdex-pro);
                }
                pro=currentIdex;
            }
            n= n>>1;
            currentIdex++;
        }
        return max;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}